/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.jomijushi.fid.servicios;



import com.jomijushi.fid.dao.ProveedorImplementsDAO;
import com.jomijushi.fid.dao.ProveedorInterfazDAO;
import com.jomijushi.fid.dominio.FidProveedor;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Jorge Valverde Rebaza
 */
public class ProveedorImplementsService implements ProveedorInterfazService {

    private ProveedorInterfazDAO proveedorDAO = new ProveedorImplementsDAO();
//    private ProveedorHasFidProductoMercaderiaInterfazDAO productosDAO = new ProveedorHasFidProductoMercaderiaImplementsDAO();
    private EntityManagerFactory emf;

    /**
     * Instancia un objeto manejador de entidades
     * @param emf objeto EntityManagerFactory
     */
    @PersistenceContext
    public void setEntityManagerFactory(EntityManagerFactory emf) {
        this.emf = emf;
    }

    /**
     * Crea un nuevo objeto proveedor
     * @param proveedor objeto FidProveedor a insertar en la BD
     */
    public void crearProveedor(FidProveedor proveedor) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        proveedorDAO.setEntityManager(em);
        try{
            proveedorDAO.persist(proveedor);
            em.getTransaction().commit();
        }
        catch(Exception e){
            em.getTransaction().rollback();
        }
        finally{
            em.close();
        }
    }

    /**
     * Edita un objeto FidProveedor
     * @param proveedor objeto a editar
     */
    public void modificarProveedor(FidProveedor proveedor) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        proveedorDAO.setEntityManager(em);
        try{
            proveedorDAO.merge(proveedor);
            em.getTransaction().commit();
        }
        catch(Exception e){
            em.getTransaction().rollback();
        }
        finally{
            em.close();
        }
    }

    /**
     * Elimina un objeto FidProveedor
     * @param proveedor objeto a eliminar
     */
    public void eliminarProveedor(FidProveedor proveedor) {       
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        proveedorDAO.setEntityManager(em);
        try{
            proveedorDAO.remove(proveedor);
            em.getTransaction().commit();
        }
        catch(Exception e){
            em.getTransaction().rollback();
        }
        finally{
            em.close();
        }

    }


    /**
     * Realiza la busqueda de un objeto FidProveedor por medio de su ruc
     * @param ruc criterio de busqueda ruc del proveedor
     * @return devuelve el objeto Fid PRoveedor correspondiente, si no existe devuelve null
     */
    public FidProveedor buscarProveedor(String ruc) {
        EntityManager em = emf.createEntityManager();
        FidProveedor proveedor = new FidProveedor();
        try{
            String jpql = "select p from FidPersonaEmpresa p where p.dniRuc = :ruc";
            proveedor = (FidProveedor)em.createQuery(jpql).setParameter("ruc", ruc).getSingleResult();
            return proveedor;
        }
        catch(Exception e){
            return null;
        }
        finally{
            em.close();
        }
    }

       /**
     * Reporta una lista de proveedores que cumplem cierto criterio
     * y ordenados por cierto criterio haciendo uso de paginacion
     * @param criterio nombre de la columna de FidProveedor con la que se buscara
     * @param keyword criterio de busqueda a usar
     * @param ordenarBy nombre de la columna de FidProveedor tomado como criterio de ordenacion
     * @param criterioOrden criterio de orden, ascendente o descendente
     * @param todo criterio de reporte total o parcial, true = total, false = parcial
     * @param limInf si el reporte es parcial, indica el limite inferior del reporte de paginacion
     * @param limSup si el reporte es parcial, indica el limite superior del reporte de paginacion
     * @return Lista de proveedores que cumplan con los criterios, si no existen devuelve lista vacia
     *//*
    public List<FidProveedor> listarProveedores(String criterio, String keyword, String ordenarBy, String criterioOrden, boolean todo, int limInf, int limSup) {
        EntityManager em = emf.createEntityManager();
        List<FidProveedor> lstProveedor = null;
        try {
             proveedorDAO.setEntityManager(em);
             lstProveedor = proveedorDAO.listarProveedores(criterio, keyword, ordenarBy, criterioOrden, todo, limInf, limSup);
        }
        catch(Exception e){
            lstProveedor = new ArrayList<FidProveedor>();
        }
        finally {
            em.close();
            return lstProveedor;
        }
    }*/

    public List<FidProveedor> listarProveedores(String valorKey, String buscar, boolean b, int c, int d, String orden)
    {
        EntityManager em = emf.createEntityManager();
        try {
            proveedorDAO.setEntityManager(em);
            List<FidProveedor> lst = proveedorDAO.listarProveedores(valorKey, buscar, b, c, d, orden);
            return lst;
        } finally {
            em.close();
        }
    }

   
}
